#ifndef MODELSHIP_H
#define MODELSHIP_H

#include <QString>

// class QPainter;

namespace ns_yht
{

    struct ModelBasicShip
    {
        quint64 mmsi;
        QString shipName;
        double lat;
        double lon;
    };

    // struct ModelFleet
    // {
    //     int id{0};
    //     int groupId{0};
    //     QString name;
    //     QString color;
    //     QString remark;
    // };

    // struct ModelFleetShip
    // {
    //     quint64 mmsi;
    //     int fleetId;
    //     QString name;
    //     int id;
    // };

    // struct TrackPoint
    // {
    //     quint64 ID = 0;
    //     double lat;
    //     double lon;
    //     qint64 time;
    //     double course;
    //     double speed;
    // };

    namespace EShipType
    {
        const int Fish = 0;           // 渔船
        const int Cargo = 1;          // 货船、货轮
        const int Oil = 2;            // 油船、油轮
        const int Drag = 3;           // 拖船、引航船、执法船
        const int Guest = 4;          // 客轮
        const int NavigationMark = 5; // 航标
        const int NetMark = 6;        // 网位移
        const int Other = 100;
    };

    enum class EMsgType
    {
        AIS = 0,
        ARPA,
        FUSED,
        SART,
        MOB,
        EPIRB
    };

    enum class ShipStatusOfSog
    {
        None = 0,
        Anchoring = 1,
        Voyaging = 2,
    };

    class ModelShip
    {
    public:
        ModelShip();
        ~ModelShip();

        int GetLengthClass();
        bool containKey(const QString &key);
        double getAngle() const;

        QString getTypeString() const;
        QString getStatusString() const;

        int length() const;
        int width() const;
        bool outlineEnable() const;

        // 根据AIS报文中的类型和MMSI以及船舶名称，分拣出航标和网位移,其余和AIS类型一样
        void setType(int aisType);

        void setMsgType(const QString smtype);
        void setNavigationStatus(const QString navStatus);
        ShipStatusOfSog getStatusOfSog() const;

        QString getName() const;

        int getShipType() const;

        QString enname;
        QString cnname;
        int imo;
        int type{0};   // 船舶类型
        QString stype; // 船舶类型的文字描述
        int navigationStatus{15};
        QString status;
        double cog{0};
        double sog{0};
        double stw{0};          // 对水速度
        double trueHeading{-1}; // 船艏向
        double roll{0};         // 前后俯仰角度
        double pitch{0};        // 左右倾斜角度
        double lat;
        double lon;
        quint64 mmsi = 0;
        int to_bow;       // 船头
        int to_stern;     // 船尾
        int to_port;      // 左舷
        int to_starboard; // 右舷
        double draught{-1};
        QString callsign;
        qint64 time;                     // 获取最近状态的时间,单位为秒
        EMsgType msgtype{EMsgType::AIS}; // 0-AIS;  1-ARPA; 2-融合； 3-SART； 4-MOB； 5-EPIRB
        QString destination;
        qint64 eta{0};
        QString nation;
        int source;
        bool isInner{false};
        double rot{0}; // 传感器转向速率，【-708，708】
        int rotAis{0}; // AIS报文转向速率，【-127，127】，128表示无信息

        qreal distance{-1};    // 距离
        qreal direction{-361}; // 方位
        qreal dcpa{-1};        // 米
        qreal tcpa{-1};        // 分钟

        bool dangerous{false};        // 是否是危险船舶（会碰撞）
        bool dangerousEnsured{false}; // 提示危险船舶后用户是否手动确认
        bool lost{false};
        bool inRadius{true}; // 是否在设定的显示半径内

    private:
        void setAsCustomType(int stype);
    };

    /**
     * @brief 所有内部船舶都属于 我的船队，这之下可分为多个组
     *
     */
    struct ModelInnerInfo
    {
        int mmsi;
        int id;           // 属于我的船队的船，在退出船队时需要一个id
        QString teamName; // 我的船队下还有分组
        int teamId{0};    // 0表示未分组，只是属于我的船队
        QString color{"#00ffff"};
    };

} // namespace ns_yht

#endif
